/*
    高性能多级缓存内存池
*/

#ifndef _H_MULIT_MEMPOOL_H_
#define _H_MULIT_MEMPOOL_H_

#include "h_mempool.h"
#include <stdint.h>

typedef struct h_mulit_mempool_s {
    h_mempool_t *mempools;      // 根据等级个数创建不同个数的内存池

    uint32_t    level;          // 级别数    
    uint32_t    total;          // 等级0初始总数
    uint32_t    expand_num;     // 等级0满的时候扩容的个数
    uint32_t    other_total;    // 其他等级的初始总数，0：缩二倍模式，即等级0 total为64，expand_num 8， 等级1 total为32，expand_num 4，依次递减。
    uint32_t    chunk_size;     // 等级0chunk 的size
} h_mulit_mempool_t;

/* 
功能: 创建一个多级内存池
参数: 无
返回值: 内存池的指针
*/
h_mulit_mempool_t *h_mulit_mempool_new();

/* 
功能:初始化一个多级内存池
参数: 
    m 内存池针指针
    level 级别个数
    total 内存池初始大小
    expand_num 扩充的个数，传入0不进行扩充
    other_total 其他等级的初始总数，0：缩二倍模式，即等级0 total为64，expand_num 8， 等级1 total为32，expand_num 4，依次递减。
    chunk_size 每个内存块的大小
返回值:  成功返回 true，失败返回 false。
*/
bool h_mulit_mempool_init(h_mulit_mempool_t *m, uint32_t level, uint32_t total, uint32_t expand_num, uint32_t other_total, uint32_t chunk_size);

/* 
功能: 从多级内存池获取一个内存块，如果无内存了，设置了扩容，则进行扩容并返回内存。
参数: 内存池指针
返回值: 内存块的指针
*/
void *h_mulit_mempool_get(h_mulit_mempool_t *m, uint32_t chunk_size);

/* 
功能: 回收内存块
参数: 内存块指针
返回值: 无
*/
void h_mulit_mempool_put(h_mulit_mempool_t *m, void *data);

/* 
功能: 销毁一个多级内存池
参数: 内存池指针
返回值: 无
*/
void h_mulit_mempool_destroy(h_mulit_mempool_t *m);

/* 
功能: 打印多级内存池状态
参数: 内存池指针
返回值: 无
*/
void h_mulit_mempool_print(h_mulit_mempool_t *m, bool detail);


#endif
